<?php
/**
 * 责任链模式
 *
 * 将一个请求按照一个责任链分配下去。
 */
//每个个体的抽象类
abstract class AbstractHandler{
	//下家的引用
	protected $NextHandler;
	//获取到的任务
	protected $dutyarray = array();
	//设置下家
	public function setNextHandler(AbstractHandler $handler)
	{
		$this->NextHandler = $handler;
	}
	//获取请求方式
	abstract public function getHandlerRequest($request);
	//查看获取到的任务
	public function gotduty()
	{
		var_dump($this->dutyarray);
	}
}
//个体A
class HandlerA extends AbstractHandler{
	public function getHandlerRequest($request)
	{
		//获取自己的任务，把不是自己的任务推给下家,如果没有下家，则只能获取任务
		if($request>=0 &&$request<10){
			array_push($this->dutyarray,$request);
		}else if($this->NextHandler instanceof AbstractHandler){
			$this->NextHandler->getHandlerRequest($request);
		}else{
			array_push($this->dutyarray,$request);
		}
	}
}
//个体B
class HandlerB extends AbstractHandler{
	public function getHandlerRequest($request)
	{
		//获取自己的任务，把不是自己的任务推给下家,如果没有下家，则只能获取任务
		if($request>=10 &&$request<20){
			array_push($this->dutyarray,$request);
		}else if($this->NextHandler instanceof AbstractHandler){
			$this->NextHandler->getHandlerRequest($request);
		}else{
			array_push($this->dutyarray,$request);
		}
	}
}
//个体C
class HandlerC extends AbstractHandler{
	public function getHandlerRequest($request)
	{
		//获取自己的任务，把不是自己的任务推给下家,如果没有下家，则只能获取任务
		if($request>=20 &&$request<30){
			array_push($this->dutyarray,$request);
		}else if($this->NextHandler instanceof AbstractHandler){
			$this->NextHandler->getHandlerRequest($request);
		}else{
			array_push($this->dutyarray,$request);
		}
	}
}

$handlerA = new HandlerA();
$handlerB = new HandlerB();
$handlerC = new HandlerC();
//设置各自的下家,这里做成一个责任环，保证无论从哪个个体开始，责任都能分发下去
$handlerA->setNextHandler($handlerB);
$handlerB->setNextHandler($handlerC);
$handlerC->setNextHandler($handlerA);
//全部责任
$requests = array( 2, 5, 14, 22, 18, 3, 27, 20 );
//分发责任
foreach($requests as $request){
	$handlerB->getHandlerRequest($request);
}
//查看各自的责任
$handlerA->gotduty();
$handlerB->gotduty();
$handlerC->gotduty();




